﻿namespace ConvertTo
{
    using System;
    using System.Text;

    public static class ConvertToMoney
    {
        #region Constants

        private const string and = "и ";

        #endregion 

        #region Static Methods

        /// <summary>
        /// Превести числовое представление в строковое денежное
        /// </summary>
        /// <param name="value">Числовое значение</param>
        /// <returns>Строка в денежном формате</returns>
        public static string ToString(double value)
        {
            string rez = string.Empty;
            string[] parts = value.ToString("0.00").Split(',', '.');
            int razryadnost = parts[0].Length / 3;
            ///дробная часть
            rez = and + IntToString(parts[1], 0);
            ///целая часть            
            for (int i = 0; i <= razryadnost; i++)
            {
                rez = IntToString((parts[0].Length / 3 != 0) ? parts[0].Substring(parts[0].Length - 3, 3) : parts[0].Substring(parts[0].Length - parts[0].Length % 3, parts[0].Length % 3), i + 1) + " " + rez;
                parts[0] = parts[0].Remove((parts[0].Length / 3 != 0) ? parts[0].Length - 3 : parts[0].Length - parts[0].Length % 3, (parts[0].Length / 3 != 0) ? 3 : parts[0].Length % 3);
            }

            return rez;
        }

        /// <summary>
        ///  Преобразовать число в строку
        /// </summary>
        /// <param name="value">Число строкой</param>
        /// <param name="razryad">Разряд</param>
        /// <returns>Число прописью</returns>
        public static string IntToString(string value, int razryad)
        {
            string rez = string.Empty;

            if (value.Length == 3)
            {
                rez = strings[30 + Convert.ToInt16(value[0].ToString())] + " ";
                rez += (value[1].Equals('0') && value[2].Equals('0')) ? padej[razryad * 10 + 9] : ConvertTens(value.Substring(1, 2), razryad);
            }

            if (value.Length == 2)
            {
                rez = ConvertTens(value.ToString(), razryad);
            }

            if (value.Length == 1)
            {
                rez = ConvertUnits(value[0].ToString(), razryad);
            }

            return rez;
        }

        /// <summary>
        /// Перевод в строку едениц в соответствии с разрядом
        /// </summary>
        /// <param name="symbol">Символьное представление числа</param>
        /// <param name="razryad">Разряд числа</param>
        /// <returns>Строковое представление единицы</returns>
        public static string ConvertUnits(string symbol, int razryad)
        {
            string rez = string.Empty;

            if (razryad == 0 || razryad == 2)
            {
                rez = strings[40 + Convert.ToInt16(symbol)];
            }
            else
            {
                rez = strings[Convert.ToInt16(symbol)];
            }

            rez += " " + padej[razryad * 10 + Convert.ToInt16(symbol)];

            return rez;
        }

        /// <summary>
        /// Перевод в строку десятков в соответствии с разрядом
        /// </summary>
        /// <param name="twoSymbol">символьное представление десятка</param>
        /// <param name="razryad">Разряд числа</param>
        /// <returns>Строковое представление десятка</returns>
        public static string ConvertTens(string twoSymbol, int razryad)
        {
            string rez = string.Empty;

            ///если десяток это число от 10 до 19
            if (twoSymbol[0].Equals('1'))
            {
                rez = strings[10 + Convert.ToInt16(twoSymbol[1].ToString())] + " " + padej[razryad * 10 + 9];
            }
            else
            {
                ///если этот десяток начинается не с 0, значит это число от 20 до 99
                if (!twoSymbol[0].Equals('0'))
                {
                    rez = strings[20 + Convert.ToInt16(twoSymbol[0].ToString())];

                    ///если при этом вторая цифра не 0, то перевести еденицы от десятка с учётом разряда
                    if (!twoSymbol[1].Equals('0'))
                    {
                        rez += " " + strings[Convert.ToInt16(twoSymbol[1].ToString())] + " " + padej[razryad * 10 + Convert.ToInt16(twoSymbol[1].ToString())];
                    }
                    ///если при этом вторая цифра равно 0, то перевести разряд
                    else
                    {
                        rez += " " + padej[razryad * 10 + 9];
                    }
                }
                ///если этот десяток начинается с 0, значит это копейки
                else
                {
                    rez = ConvertUnits(twoSymbol[1].ToString(), razryad);
                }
            }

            return rez;
        }

        #endregion

        #region Private fields

        private static readonly string[] padej = { "копеек", "копейка", "копейки", "копейки", "копейки", "копеек", "копеек", "копеек", "копеек", "копеек",      
                                                    "рублей", "рубль","рубля","рубля","рубля","рублей","рублей","рублей","рублей","рублей",
                                                    "","тысяча","тысячи","тысячи","тысячи","тысяч","тысяч","тысяч","тысяч","тысяч",
                                                    "", "миллион","миллиона","миллиона","миллиона","миллионов","миллионов","миллионов","миллионов","миллионов",
                                                    "","миллиард","миллиарда","миллиарда","миллиарда","миллиардов","миллиардов","миллиардов","миллиардов","миллиардов"};

        private static readonly string[] strings = {"ноль", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять",
                                                    "десять", "одинадцать", "двенадцать", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать",
                                                    "", "", "двадцать", "тридцать", "сорок", "пятьдесят", "шестьдесят", "семьдесят", "восемьдесят", "девяносто",
                                                    "", "сто", "двести", "триста", "четыреста", "пятьсот", "шестьсот", "семьсот", "восемьсот", "девятьсот",
                                                    "ноль", "одна", "две", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять" };

        #endregion

    }


}
